15 sample_RPG.hsp
sample\
15 sample_RPG.hsp
#include "hsp3dish.as"
; #include "ezlocal-dish-js.hsp"
; ezLocalJS
title "RPGサンプル"
//--------------------------------------
// 必要モジュール読み込み
//--------------------------------------
#include "mod_layerbutton.hsp"
#include "mod_layerbutton-vpad.hsp"
#include "mod_layerbutton-emes.hsp"
// dotfw.asのjstick/stickにキーを送り込む(df_addKey@)ため一時的に上書き
#ifdef _hspwin
#undef stick
#define global stick(%1,%2=0,%3=1) if _dotfw_joystick@ { jstick %1,%2 : %1|=df_addKey@ }else{ stick@hsp %1,%2,%3 : %1|=df_addKey@ }
#define ___hspwin
#else
#undef stick
#define global stick(%1,%2=0,%3=1) stick@hsp %1,%2,%3 : %1|=df_addKey@
#endif
#undef _hspwin
// dotfwモジュール読み込み
#include "dotfw.as"
// 一時的な上書きを元に戻す
#ifdef ___hspwin
#define global _hspwin
#endif
#undef stick
#define global stick(%1,%2=0,%3=1) stick@hsp %1,%2,%3
//--------------------------------------
// フォント変更
//--------------------------------------
#dishjs_font "MPLUS1p-Regular.ttf", 2,,-5 ; フォントファイル名を指定 (ブラウザ) // ezlocal-dish-jsというモジュールを利用した場合の拡張命令
font_file "MPLUS1p-Regular.ttf" ; フォントファイル一時読み込み (Windows) // 沢渡氏のモジュール(スクリプト末尾に記述)
//--------------------------------------
// HSP3Dish.js用 設定
//--------------------------------------
info_os = sysinfo(0)
if instr(info_os,0,"Emscripten")>=0 {
mm_dir=""
fontName = "M PLUS 1p"
fontSize = 19
fontSize_money = 14
fontSize_item = 16
} else {
mm_dir="data/"
fontName = "M PLUS 1p"
fontSize = 26
fontSize_money = 20
fontSize_item = 22
}
//------------------------------------------------------------------------------
// ゲーム : 初期化
//------------------------------------------------------------------------------
//--------------------------------------
// 画面設定
//--------------------------------------
df_config "X480 Y800 Z100"
df_reset
//--------------------------------------
// プレイヤーキャラクターを登録
//--------------------------------------
celload "tamadot.png",-1 ; 画像ファイル読み込み
bufId = stat
es_size 64,64 ; キャラクターのサイズ指定
es_patanim 0, 4, 64*4, 64*0, 12, bufId ; キャラクターの登録(0〜3)
es_patanim 4, 4, 64*4, 64*1, 12, bufId ; キャラクターの登録(4〜7)
es_patanim 8, 4, 64*4, 64*2, 12, bufId ; キャラクターの登録(8〜11)
es_patanim 12,4, 64*4, 64*3, 12, bufId ; キャラクターの登録(12〜15)
//--------------------------------------
// バーチャルパッドの設置
//--------------------------------------
celload mm_dir+"jujikey.png", -1
cel_juji = stat : celdiv cel_juji,64,64
celload mm_dir+"btn2x.png", -1
cel_btn2x = stat : celdiv cel_btn2x,128,128, 64,64
celload mm_dir+"btn.png", -1
cel_btn = stat : celdiv cel_btn,64,64, 32,32
celload mm_dir+"bean.png", -1
cel_bean = stat : celdiv cel_bean,64,42, 32,21
#enum GROUPID_pad_jujikey = 10
#enum GROUPID_pad_mainkey
#enum GROUPID_pad_subbkey
#enum GROUPID_pad_menukey
pos 100,ginfo_sy-85
JujikeyCon cel_juji, 5, 1.1, GROUPID_pad_jujikey, jujikey, 15
pos ginfo_sx-100,ginfo_sy-70
BeanCon cel_btn2x, M_PI*2, 1.0, GROUPID_pad_mainkey, mainkey, 0
pos ginfo_sx-200,ginfo_sy-40
BeanCon cel_btn, M_PI*2, 1.0, GROUPID_pad_subbkey, subbkey, 0
pos ginfo_sx-35,ginfo_sy-130
BeanCon cel_bean, 45.0/180.0*M_PI, 0.9, GROUPID_pad_menukey, menukey, 0
//--------------------------------------
// マップ読み込み
//--------------------------------------
#define MYMAP_ID (1)
df_loadbgmap MYMAP_ID, mm_dir+"test2.tmap"
mapsx = _dotfw_curmapx ; マップサイズXを取得
mapsy = _dotfw_curmapy ; マップサイズYを取得
maptipWidth = 64
maptipHeight = 64
df_getbgmap map, MYMAP_ID ; マップ配列変数を取得
df_mapaction MYMAP_ID, 0, 0 ; マップアクション設定
df_bgview MYMAP_ID, 80,80, 20,20 ; スクロール設定
//--------------------------------------
// 音声読み込み
//--------------------------------------
#enum MM_BGM = 0
#enum MM_KEY
#enum MM_PIP
mmload mm_dir+"maou_game_field03.mp3", MM_BGM, 1 : mmvol MM_BGM,-500 ; HSP3.7beta10〜HSP3.7のHSP3Dish.jsではmp3がループしないかもしれません
mmload mm_dir+"kaiwa1_tan.wav", MM_KEY, 0 : mmvol MM_KEY,-500
mmload mm_dir+"selected6.wav", MM_PIP, 0 : mmvol MM_PIP,-500
//--------------------------------------
// プレイヤーを追加
//--------------------------------------
df_addplayer 300,200,0
df_paction *MAPNOTICE, PACTION_MAPITEM ; マップイベント処理
player_gold = 0
df_pmode -1 ; 初期状態はプレイヤー操作禁止
//------------------------------------------------------------------------------
// ゲーム : メインルーチン
//------------------------------------------------------------------------------
// 音声許可
objlayer_myDialog "音声を再生しても良いですか?", "はい", "いいえ"
*audio_allow_request
layerbtn_stickVar = jujikey | mainkey*$20 ; layerbuttonモジュール用にキーを送り込む
df_update
if myDialog_stat == 0 : goto *audio_allow_request
if myDialog_stat == 1 : audio_allowed = 1 : mmplay MM_BGM ; BGMループ再生
df_pmode 0 ; プレイヤー操作許可
// 旅立ち
*main
// バーチャルパッド入力をドットフレームワークやlayerbuttonに反映
df_addKey@ = jujikey ; dotfw.asのjstick/stickにキーを送り込む
layerbtn_stickVar = jujikey | mainkey*$20 ; layerbuttonモジュール用にキーを送り込む
// プレイヤーキャラの向きを補正
gosub *update_PlayerFacing
// マップイベント監視サブルーチン
gosub *SUB_MAPNOTICE
// メニュー処理
openMenu = ((key@&128)!=0) | menukey ; key@ : dotfw.as内でstick結果が代入されている
gosub *MENU_PROCESS
// ドットフレームワークの画面更新 (redraw/awaitもこの中に含まれている)
df_update
goto *main
//------------------------------------------------------------------------------
// ゲーム : サブルーチン
//------------------------------------------------------------------------------
//--------------------------------------
// プレイヤーキャラの向きを補正
//--------------------------------------
*update_PlayerFacing
if sp_player_mode@HSP3MOD_DOTFW == -1 : return ; プレイヤーの動作モードが無効であれば処理しない
df_getplayer
_dotfw_my_dx = _dotfw_myx - mae_dotfw_myx : mae_dotfw_myx = _dotfw_myx
_dotfw_my_dy = _dotfw_myy - mae_dotfw_myy : mae_dotfw_myy = _dotfw_myy
newchr = -1
if newchr!=mychr : if key@&8 : if _dotfw_my_dy>0||_dotfw_my_dx==0 : newchr=0 ; 下移動(上移動より優先)
if newchr!=mychr : if key@&4 : if _dotfw_my_dx>0||_dotfw_my_dy==0 : newchr=12 ; 右移動(左移動より優先)
if newchr!=mychr && newchr!=12: if key@&1 : if _dotfw_my_dx<0||_dotfw_my_dy==0 : newchr=4 ; 左移動
if newchr!=mychr && newchr!=0 : if key@&2 : if _dotfw_my_dy<0||_dotfw_my_dx==0 : newchr=8 ; 上移動
if newchr == -1 || mychr == newchr : return ; 向き変更なしならreturn
// キャラクターの向きを置き換える
mychr = newchr
es_chr 0, mychr
return
//--------------------------------------
// マップイベント
//--------------------------------------
// マップイベント開始検知ルーチン
*MAPNOTICE
if noticeMapX != 0 || noticeMapY != 0 : return
noticeMapX = _dotfw_curmapx
noticeMapY = _dotfw_curmapy
noticeState = 1 ; スタートは良いがマス内でダンスしたりすると途切れるので、別(SUB_MAPNOTICE)で毎フレーム監視をする
; logmes "監視開始 ("+_dotfw_curmapx+","+_dotfw_curmapy+")"
return
// マップイベント処理監視サブルーチン
*SUB_MAPNOTICE
if noticeMapX == 0 || noticeMapY == 0 : return
pw=(_dotfw_myx - noticeMapX * maptipWidth)*100/maptipWidth
ph=(_dotfw_myy - noticeMapY * maptipHeight)*100/maptipHeight
if pw<-85 || pw>85 || ph<-85 || ph>85 {
; logmes "監視終了"
noticeMapX=0 :noticeMapY=0 :noticeState=0 : return
}
if noticeState != 1 : return
if pw>=-50 && pw<=50 && ph>=-50 && ph<=50 {
noticeState = 2
; logmes "イベント発生! at ("+noticeMapX+","+noticeMapY+")"
if noticeMapX== 6 && noticeMapY== 4 : gosub *event_town_1
if noticeMapX== 6 && noticeMapY==16 : gosub *event_town_2
if noticeMapX==12 && noticeMapY==18 : gosub *event_town_3
if noticeMapX==22 && noticeMapY== 8 : gosub *event_town_4
if noticeMapX==21 && noticeMapY==14 : gosub *event_town_5
if noticeMapX==17 && noticeMapY==15 : gosub *event_coin_1
if noticeMapX==21 && noticeMapY==16 : gosub *event_coin_2
if noticeMapX==23 && noticeMapY==19 : gosub *event_siro_1
}
return
// マップイベント処理
*event_town_1
CREATE_MSGBOX {"
ここは始まりの街^
入れませんけど
"}
return
*event_town_2
CREATE_MSGBOX {"
ここは山奥の里^
入れませんけど
"}
return
*event_town_3
CREATE_MSGBOX {"
ここは果ての岬^
入れませんけど
"}
return
*event_town_4
CREATE_MSGBOX {"
ここは海沿いの町^
入れませんけど
"}
return
*event_town_5
CREATE_MSGBOX {"
ここは荒地の村^
入れませんけど
"}
return
*event_coin_1
player_gold += 100
CREATE_MSGBOX {"
100G 手に入れた!
"}
map(mapsx*_dotfw_curmapy+_dotfw_curmapx)=2 ; アイテムを消す (マップチップ上書き)
return
*event_coin_2
player_gold += 150
CREATE_MSGBOX {"
150G 手に入れた!
"}
map(mapsx*_dotfw_curmapy+_dotfw_curmapx)=2 ; アイテムを消す (マップチップ上書き)
return
*event_siro_1
CREATE_MSGBOX {"
ここは魔王の城^
-------------入れませんけど
"}
return
//--------------------------------------
// メッセージボックス処理
//--------------------------------------
// 定数
#enum GROUPID_MSGBOX = 20
#const MSGBOX_PX 80
#const MSGBOX_PY 50
#const MSGBOX_W 320
#const MSGBOX_H 100
#const MSGBOX_TEXTCOLOR $FFFFFF
#const MSGBOX_TEXTSPEED 2
// 作成関数
#deffunc CREATE_MSGBOX str MSGBOX_message
if laybtn_length(GROUPID_MSGBOX) : return ; 連続して複数回呼ばれることはないが念のため
pos MSGBOX_PX,MSGBOX_PY : rgbcolor MSGBOX_TEXTCOLOR
layeremes MSGBOX_W,MSGBOX_H, 0,GROUPID_MSGBOX, MSGBOX_message,0, MSGBOX_TEXTSPEED {
layemes_font fontName, fontSize, 17
layemes_settings 2, 0,0, -1+(MM_KEY+1)*audio_allowed ; [設定] 終了後非表示にしない、文字表示時に音を鳴らす
if lparam == objlayer_cmdinit : df_pmode -1 ; メッセージ中はプレイヤー操作禁止
if lparam == objlayer_cmdterm : df_pmode 0 : noticeState=0 ; メッセージ終了でプレイヤー操作再開
if lparam == objlayer_cmddraw {
laybtn_ezbox $DD313021,,, "",, ,,,, 10, ,,40,20 ; オブジェクトの範囲をはみ出してボックスを描画
laybtn_ezfrm $EEFFFFFF,,,4, "",, ,,,, 10, ,,38,18 ; 枠を描画
if layemes_stat>=2 {
if (layemes_cnt/10\5) < 3 {
rgbcolor MSGBOX_TEXTCOLOR : pos objlayer_axis_x2,objlayer_axis_y2-18
mes "▼" ; ボックス右下にページ送り表示
}
}
}
return
}
return
//--------------------------------------
// メニューイベント
//--------------------------------------
// 定数
#enum GROUPID_MENUBOX = 21
#enum GROUPID_MENUGOLD
#enum GROUPID_MENUITEM
#const MENUBOX_PX 80
#const MENUBOX_PY 50
#const MENUBOX_W 120
#const MENUBOX_H 30
#const MENUBOX_TEXTCOLOR $FFFFFF
#const MENUBOX_TEXTSPEED 2
// コマンドメニュー作成ルーチン
*MENU_PROCESS
if openMenu == 0 : return
if noticeState == 2 : return ; マップイベントに入った場合はメニューを開かない
if sp_player_mode@HSP3MOD_DOTFW == -1 : return ; プレイヤーの動作モードが無効のときはメニューを開かない
if laybtn_length(GROUPID_MENUBOX) : return ; 連続して複数回呼ばれることはないが念のため
df_pmode -1 ; メニュー中はプレイヤー操作禁止
// コマンドメニュー作成
cmdText = "はなす","じゅもん","どうぐ","しらべる","つよさ","さくせん"
if audio_allowed : mmplay MM_PIP
repeat 6
pos MENUBOX_PX+(MENUBOX_W+20)*(cnt\2), MENUBOX_PY+(MENUBOX_H+5)*(cnt/2)
// コマンドメニューのボタン作成
layerbutton MENUBOX_W,MENUBOX_H, cnt, GROUPID_MENUBOX, 0,0,0, 10 {
laybtn_settings 0,32,3 ; 設定: 範囲外でもフォーカス維持、非表示しない
if lparam == objlayer_cmddraw {
// コマンドボタンをまとめる背景の描画 (1つ目のボタン描画の前に描画する)
if objlayer_option == 0 && layerbtn_stat < LAYBTN_COMPLETE {
fade = $DD : if layerbtn_stat == LAYBTN_SHOW_OUT : fade = $DD*(10 - layerbtn_cnt)/10 ; メニューが消えるときフェードさせる
gmode 3,,,fade : rgbcolor $313021
laybtn_boxfb objgroup_axis_x-32, objgroup_axis_y-12, objgroup_axis_x2+32, objgroup_axis_y2+12, 10
gmode 3,,,fade : rgbcolor $FFFFFF
laybtn_boxfb objgroup_axis_x-30, objgroup_axis_y-10, objgroup_axis_x2+30, objgroup_axis_y2+10, 10, 4
}
// コマンドボタンの描画
rgbcolor MENUBOX_TEXTCOLOR : font fontName, fontSize, 17 ; laybtn_ezboxのテキスト設定
laybtn_ezbox $01000000,$669999FF,$669999FF, cmdText(objlayer_option),, ,,,, 0 ; R(丸み)=0
// 「どうぐ」を選んで使用不可状態のときはグレーアウト表示 (黒を被せる)
laybtn_enable GROUPID_MENUBOX, -1
if stat == 0 {
if objlayer_option == 5 {
gmode 3,,,$99 : rgbcolor $313021
laybtn_boxfb objgroup_axis_x-32, objgroup_axis_y-12, objgroup_axis_x2+32, objgroup_axis_y2+12, 10
}
return ; 使用不可状態のときは以降の処理を行わない
}
// 操作: メニュー閉じ
if layerbtn_cnt > 0 { ; メニューを作成した瞬間のキー押下を無視
if ((key@&128)!=0) | subbkey {
laybtn_hide GROUPID_MENUBOX
laybtn_hide GROUPID_MENUGOLD
df_pmode 0 ; メニュー終了でプレイヤー操作再開
return
}
}
// 操作: ボタンのクリック判定
if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
switch objlayer_option
case 0 : gosub *MENU_HANASU : swbreak
case 1 : gosub *MENU_JUMON : swbreak
case 2 : gosub *MENU_DOUGU : swbreak
case 3 : gosub *MENU_SHIRABERU : swbreak
case 4 : gosub *MENU_TSUYOSA : swbreak
case 5 : gosub *MENU_SAKUSEN : swbreak
swend
}
}
return
}
loop
// GOLD表示 (表示のみ操作なし)
pos 290,550
layerbutton 150,30, 0, GROUPID_MENUGOLD, 0,0,0, 10 {
laybtn_settings 1,1,0 ; 設定変更 : キー/マウス操作不可
if lparam == objlayer_cmddraw {
laybtn_ezbox $DD313021,,, "",, ,,,, 10, ,,30,15 ; オブジェクトの範囲をはみ出してボックスを描画
laybtn_ezfrm $DDFFFFFF,,,4, "",, ,,,, 10, ,,28,13 ; 枠描画
rgbcolor MENUBOX_TEXTCOLOR : font fontName, fontSize, 17 ; テキスト設定
laybtn_mes ""+player_gold+" G",0, 2,1
font fontName, fontSize_money, 17
laybtn_mes "所持金",0, 0,1
}
return
}
laybtn_focus GROUPID_MENUBOX, 0 ; メニューの最初のボタンにフォーカスを当てる
return
*MENU_HANASU
laybtn_hide GROUPID_MENUBOX, 1
laybtn_hide GROUPID_MENUGOLD, 1
CREATE_MSGBOX {"目の前に話せる人は誰もいない"}
return
*MENU_JUMON
laybtn_hide GROUPID_MENUBOX, 1
laybtn_hide GROUPID_MENUGOLD, 1
CREATE_MSGBOX {"何も呪文を覚えていない!"}
return
*MENU_SHIRABERU
laybtn_hide GROUPID_MENUBOX, 1
laybtn_hide GROUPID_MENUGOLD, 1
CREATE_MSGBOX {"
足元を調べてみた^
しかし自分の足しか見えない!
"}
return
*MENU_TSUYOSA
laybtn_hide GROUPID_MENUBOX, 1
laybtn_hide GROUPID_MENUGOLD, 1
CREATE_MSGBOX {"たいして強くない!"}
return
*MENU_SAKUSEN
laybtn_hide GROUPID_MENUBOX, 1
laybtn_hide GROUPID_MENUGOLD, 1
CREATE_MSGBOX {"作戦なんて何もない!"}
return
*MENU_DOUGU
// 道具メニューはフェードアウト中に再度開かれるのを防止(または再表示前に古いのを削除)する処置を施す必要がある。(これがないと、消えようとしているのにもう1つ作ってしまい、フェードアウト→1つ目が消える→2つ目も同じIDなので一緒に消える となってしまう)
if laybtn_length(GROUPID_MENUITEM) : laybtn_hide GROUPID_MENUITEM, -1 ; 既に道具メニューが開かれている場合は閉じる
laybtn_enable GROUPID_MENUBOX, 0 ; メインメニューを無効化して道具メニューが閉じられるまで操作できないようにする
sdim itemText,64,18
itemText.0 = "何も持ってない" ; アイテム
if audio_allowed : mmplay MM_PIP
repeat 18
pos MENUBOX_PX+(MENUBOX_W+20)*(cnt\2), MENUBOX_PY+(MENUBOX_H+5)*(cnt/2)+140
// メニューのボタン作成
layerbutton MENUBOX_W,MENUBOX_H, cnt, GROUPID_MENUITEM, 0,0,0, 10 {
laybtn_settings 64,32,3 ; 設定: キーリピート有効、範囲外でもフォーカス維持、非表示しない
if lparam == objlayer_cmddraw {
// ボタンの描画
// コマンド背景(1つ目のボタン描画の前に描画する)
if objlayer_option == 0 && layerbtn_stat < LAYBTN_COMPLETE {
fade = $DD : if layerbtn_stat == LAYBTN_SHOW_OUT : fade = $DD*(10 - layerbtn_cnt)/10
gmode 3,,,fade : rgbcolor $313021
laybtn_boxfb objgroup_axis_x-32, objgroup_axis_y-12, objgroup_axis_x2+32, objgroup_axis_y2+12, 10
gmode 3,,,fade : rgbcolor $FFFFFF
rboxba_auto@modlaybtn objgroup_axis_x-30, objgroup_axis_y-10, objgroup_axis_x2+30, objgroup_axis_y2+10, 10, 4
}
rgbcolor $AAAAAA : font fontName, fontSize_item, 17 ; テキスト設定
laybtn_ezbox $01000000,$669999FF,$669999FF, itemText(objlayer_option),, ,,,, 0
// 操作: メニュー閉じ
if layerbtn_cnt > 0 { ; メニューを作成した瞬間(cnt=0)のキー押下を無視
if ((key@&128)!=0) | subbkey {
laybtn_hide GROUPID_MENUITEM ; アイテムボックスを閉じる
laybtn_enable GROUPID_MENUBOX, 1
laybtn_focus GROUPID_MENUBOX, 2 ; メニューの「どうぐ」ボタンにフォーカスを当てる
return
}
}
// 操作: ボタンのクリック判定 は今回なし
}
return
}
loop
laybtn_focus GROUPID_MENUITEM, 0 ; 「どうぐ」メニューの最初のボタンにフォーカスを当てる
return
//--------------------------------------
// ダイアログボックス処理
//--------------------------------------
// 定数
#enum GROUPID_DIALOGBOX = 30
#deffunc objlayer_myDialog str DIALOG_message, str bt1_text, str bt2_text
if laybtn_length(GROUPID_DIALOGBOX) : return
myDialog_stat = 0
myDialog_text = DIALOG_message, bt1_text, bt2_text
pos 50, 300
layerbutton 360,180, 0,GROUPID_DIALOGBOX, 30,,, 15 {
laybtn_settings 1,1,0 ; 設定: 表示だけ、キー/マウス操作不可
if lparam != objlayer_cmddraw : return ; _cmddraw以外無視
font fontName, fontSize, 17 : rgbcolor $FFFFFF
laybtn_ezbox $DD313021,,, myDialog_text(objlayer_option),0, ,-40
laybtn_ezfrm $EEFFFFFF,,,2, ,, ,,,,,,,-2,-2
return
}
pos 90+150*0, 390
layerbutton 130,50, 1,GROUPID_DIALOGBOX, 30,,, 15 {
if lparam != objlayer_cmddraw : return ; _cmddraw以外無視
font fontName, fontSize, 17
color 240,240,255 : objcolor 10,10,10 ; 文字色 / 縁取り色
laybtn_ezbox $AA9999FF, $AA0000FF, $EEAAAAFF, myDialog_text(objlayer_option),4
laybtn_ezfrm $99FFFFFF, $99FFFFFF, $99FFFFFF, 1
if layerbtn_stat != LAYBTN_COMPLETE_SELECTED : return ; 押したボタン以外無視
myDialog_stat = objlayer_option
return
}
pos 90+150*1, 390
layerbutton 130,50, 2,GROUPID_DIALOGBOX, 30,,, 15 {
if lparam != objlayer_cmddraw : return ; _cmddraw以外無視
font fontName, fontSize, 17
color 255,240,240 : objcolor 10,10,10 ; 文字色 / 縁取り色
laybtn_ezbox $AAFF9999, $AAFF0000, $EEFFAAAA, myDialog_text(objlayer_option),4
laybtn_ezfrm $99FFFFFF, $99FFFFFF, $99FFFFFF, 1
if layerbtn_stat != LAYBTN_COMPLETE_SELECTED : return ; 押したボタン以外無視
myDialog_stat = objlayer_option
return
}
return
; HSPTV!掲示板「フォントファイルをexeファイルにパック」内
; - 沢渡 氏 モジュール // thanks!
; https://hsp.tv/play/pforum.php?mode=pastwch&num=95145
;
; -- スクリプト末尾に配置しても使えるように多少変えさせて頂いてます。
;
//フォントをインストールせずに使用するモジュール
//(パックファイル対応版)
#include "gdi32.as"
#module
#const use_fonts 10 //登録できるフォントの最大数(変更可能)
#deffunc font_file_init
l_flag=0
dim h_font,use_fonts
return
//font_file p1,p2,p3
//指定したメモリ内のファイル名のフォントを一時的に使えるように登録する。
//p1はフォントのファイル名。
//p2を1にした場合はこれまでの登録を解除。(省略時は0)
//p3は旧バージョンとの互換のために残しています。省略可能で、指定しても意味はありません。
;#define global font_file(%1,%2=0,%3=0x30) _font_file %1,%2
#deffunc font_file str file,int cl_flag,local size,local tmp,local dum
if cl_flag : font_clean
if l_flag>=use_fonts : return 0
exist file : size=strsize
if size=-1 : return 0
sdim tmp,size : bload file,tmp,size : dum=0
AddFontMemResourceEx varptr(tmp),size,0,varptr(dum)
if stat : h_font(l_flag)=stat : l_flag++
return dum
#deffunc font_clean onexit
repeat
if l_flag<=0 : break
l_flag--
RemoveFontMemResourceEx h_font(l_flag)
loop
return
#global